/**
 * N个人站成环形，只能顺时针移动，给出每两个人之间的距离（一共N个距离）
 * 问有多少对(i, j)满足Ai到Aj的距离是M的倍数
 * 
 * 对每个i统计他到多少个j是M的倍数，然后累加即可
 * 每个i一共有N-1个候选距离，把这些距离按照对M取模进行分类计数，令计数器为C
 * 
 * 对于第1个人而言，C[0]对答案有贡献，显然
 * 现在考虑第2个人，首先应该令 C[S[1]] -= 1， 因为这个距离不计算了
 * 其次应该令 C[S[N]] += 1， 相当于第2个人到第1个人的距离，于是始终保证有N-1个距离
 * 最后，现在不能再计算C[0]，而应该计算C[S[1]]。
 * 
 * O(2N)
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int N;
vi A;
vll S;
int M;
map<int, int> Map;
vi C;

void work(){
    cin >> N >> M;
    A.assign(N + 1, 0);
    S.assign(N + N + 1, 0LL);
    for(int i=1;i<=N;++i){
        cin >> A[i];
        S[i] = (S[i - 1] + A[i]) % M;
    }
    for(int i=1;i<=N;++i){
        S[N + i] = (S[N + i - 1] + A[i]) % M;
    }

    C.assign(M, 0);
    for(int i=1;i<N;++i) C[S[i]] += 1;
    
    llt ans = 0;
    int off = 0;
    for(int i=1;i<=N;++i){
        ans += C[off];
        
        C[S[i]] -= 1;
        off = (off + A[i]) % M;
        C[S[N - 1 + i]] += 1;
    }
    cout << ans << endl;
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}